home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_023 / ver30 / tty / termcap / ttykbd.c < prev   
C/C++ Source or Header  |  1992-05-06  |  4KB  |  175 lines

  1. /*
  2.  * Name:    MicroEMACS
  3.  *         Digital ANSI terminal keyboard.
  4.  *        Assumes LK201, which is OK on the VT100.
  5.  * Version:    29
  6.  * Last edit:    05-Feb-86
  7.  * By:        rex::conroy
  8.  *        decvax!decwrl!dec-rhea!dec-rex!conroy
  9.  */
  10. #include    "def.h"
  11.  
  12. #define    ESC    0x1B            /* Escape, arrows et al.    */
  13. #define    AGRAVE    0x60            /* LK201 kludge.        */
  14.  
  15. /*
  16.  * The special keys on an LK201 send back
  17.  * escape sequences of the general form <ESC>[nnn~, where
  18.  * nnn is a key code number. This table is indexed by the
  19.  * nnn code to get the key code, which is used in the
  20.  * binding table. The F4 key, and the F6 through F14 keys
  21.  * have key codes. Also F17 through F20. Think of
  22.  * help and do as special.
  23.  */
  24. short    lk201map[] = {
  25.     KRANDOM,    KFIND,        KINSERT,    KREMOVE,
  26.     KSELECT,    KPREV,        KNEXT,        KRANDOM,
  27.     KRANDOM,    KRANDOM,    KRANDOM,    KRANDOM,
  28.     KRANDOM,    KRANDOM,    KF4,        KRANDOM,
  29.     KRANDOM,    KF6,        KF7,        KF8,
  30.     KF9,        KF10,        KRANDOM,    KF11,
  31.     KF12,        KF13,        KF14,        KRANDOM,
  32.     KHELP,        KDO,        KRANDOM,    KF17,
  33.     KF18,        KF19,        KF20
  34. };
  35.  
  36. /*
  37.  * Names for the keys with basic keycode
  38.  * between KFIRST and KLAST (inclusive). This is used by
  39.  * the key name routine in "kbd.c".
  40.  */
  41. char    *keystrings[] = {
  42.     NULL,        "Up",        "Down",        "Left",
  43.     "Right",    "Find",        "Insert",    "Remove",
  44.     "Select",    "Previous",    "Next",        "F4",
  45.     "F6",        "F7",        "F8",        "F9",
  46.     "F10",        "F11",        "F12",        "F13",
  47.     "F14",        "Help",        "Do",        "F17",
  48.     "F18",        "F19",        "F20",        "PF1",
  49.     "PF2",        "PF3",        "PF4",        NULL
  50. };
  51.  
  52. /*
  53.  * Read in a key, doing the low level mapping
  54.  * of ASCII code to 11 bit code. This level deals with
  55.  * mapping the special keys into their spots in the C1
  56.  * control area. The C0 controls go right through, and
  57.  * get remapped by "getkey".
  58.  */
  59. getkbd()
  60. {
  61.     register int    c;
  62.     register int    n;
  63. loop:
  64.     c = ttgetc();
  65.     if (c == ESC) {
  66.         c = ttgetc();
  67.         if (c == '[') {
  68.             c = ttgetc();
  69.             if (c == 'A')
  70.                 return (KUP);
  71.             if (c == 'B')
  72.                 return (KDOWN);
  73.             if (c == 'C')
  74.                 return (KRIGHT);
  75.             if (c == 'D')
  76.                 return (KLEFT);
  77.             if (c>='0' && c<='9') {    /* LK201 functions.    */
  78.                 n = 0;
  79.                 do {
  80.                     n = 10*n + c - '0';
  81.                     c = ttgetc();
  82.                 } while (c>='0' && c<='9');
  83.                 if (c=='~' && n<=34) {
  84.                     c = lk201map[n];
  85.                     if (c != KRANDOM)
  86.                         return (c);
  87.                     goto loop;
  88.                 }
  89.             }
  90.             goto loop;
  91.         }
  92.         if (c == 'O') {    
  93.             c = ttgetc();
  94.             if (c == 'A')
  95.                 return (KUP);
  96.             if (c == 'B')
  97.                 return (KDOWN);
  98.             if (c == 'C')
  99.                 return (KRIGHT);
  100.             if (c == 'D')
  101.                 return (KLEFT);
  102.             if (c == 'P')
  103.                 return (KPF1);
  104.             if (c == 'Q')
  105.                 return (KPF2);
  106.             if (c == 'R')
  107.                 return (KPF3);
  108.             if (c == 'S')
  109.                 return (KPF4);
  110.             goto loop;
  111.         }
  112.         if (ISLOWER(c) != FALSE)    /* Copy the standard    */
  113.             c = TOUPPER(c);        /* META code.        */
  114.         if (c>=0x00 && c<=0x1F)
  115.             c = KCTRL | (c+'@');
  116.         return (KMETA | c);
  117.     }
  118. #if DO_METAKEY
  119.     if (c & 0x80)        /* if meta bit set on input */
  120.         return (KMETA | (c & 0x7f)); /* move bit from 8th to KMETA */
  121. #endif
  122.     return (c);
  123. }
  124.  
  125. /*
  126.  * Terminal specific keymap initialization.
  127.  * Attach the special keys to the appropriate built
  128.  * in functions. Bind all of the assigned graphics in the
  129.  * DEC supplimental character set to "ins-self".
  130.  * As is the case of all the keymap routines, errors
  131.  * are very fatal.
  132.  */
  133. ttykeymapinit()
  134. {
  135.     register SYMBOL    *sp;
  136.     register int    i;
  137.  
  138.     keydup(KFIND,    "search-again");
  139.     keydup(KHELP,    "help");
  140.     keydup(KINSERT, "yank");
  141.     keydup(KREMOVE, "kill-region");
  142.     keydup(KSELECT, "set-mark");
  143.     keydup(KPREV,    "back-page");
  144.     keydup(KNEXT,    "forw-page");
  145.     keydup(KDO,    "execute-macro");
  146.     keydup(KF17,    "back-window");
  147.     keydup(KF18,    "forw-window");
  148.     keydup(KF19,    "enlarge-window");
  149.     keydup(KF20,    "shrink-window");
  150.     keydup(KUP,    "back-line");
  151.     keydup(KDOWN,    "forw-line");
  152.     keydup(KRIGHT,    "forw-char");
  153.     keydup(KLEFT,    "back-char");
  154.  
  155.     /*
  156.      * Bind all GR positions that correspond
  157.      * to assigned characters in the Digital multinational
  158.      * character set to "ins-self". These characters may
  159.      * be used just like any other character.
  160.      */
  161.  
  162.     if ((sp=symlookup("ins-self")) == NULL)
  163.         abort();
  164.     for (i=0xA0; i<0xFF; ++i) {
  165.         if (i!=0xA4 && i!=0xA6 && i!=0xAC && i!=0xAD && i!=0xAE
  166.         &&  i!=0xAF && i!=0xB4 && i!=0xB8 && i!=0xBE && i!=0xF0
  167.         &&  i!=0xFE && i!=0xA0) {
  168.             if (binding[i] != NULL)
  169.                 abort();
  170.             binding[i] = sp;
  171.             ++sp->s_nkey;
  172.         }
  173.     }
  174. }
  175.